/**
 * 微信支付工具类
 * 支持：微信小程序支付、H5支付、公众号支付
 */
import { getToken } from '@/utils/auth' // 从缓存获取Token（若依框架默认）

const wxPay = {
  /**
   * 调起微信小程序支付
   * @param {Object} payParams 支付参数（后端返回的prepay_id等）
   * @param {Function} success 支付成功回调
   * @param {Function} fail 支付失败回调
   */
  miniProgramPay: function(payParams, success, fail) {
    if (!wx || typeof wx.requestPayment !== 'function') {
      fail(new Error('当前环境不支持微信支付'))
      return
    }

    // 小程序支付参数格式：时间戳、随机串、签名等需从后端返回的参数中提取
    const params = {
      timeStamp: payParams.timeStamp.toString(), // 时间戳（字符串类型）
      nonceStr: payParams.nonceStr, // 随机字符串
      package: payParams.package, // 预支付会话标识（格式：prepay_id=xxx）
      signType: payParams.signType || 'RSA', // 签名类型（默认RSA）
      paySign: payParams.paySign, // 支付签名
      success: (res) => {
        if (res.errMsg === 'requestPayment:ok') {
          success(res) // 支付成功
        } else {
          fail(new Error('支付结果未知：' + res.errMsg))
        }
      },
      fail: (err) => {
        fail(new Error('支付失败：' + err.errMsg))
      }
    }

    // 调用微信小程序支付接口
    wx.requestPayment(params)
  },

  /**
   * 调起H5支付（需在微信浏览器中）
   * @param {String} payUrl 后端返回的H5支付跳转链接
   */
  h5Pay: function(payUrl) {
    if (!window.WeixinJSBridge) {
      throw new Error('请在微信浏览器中打开')
    }
    // H5支付通过跳转链接实现
    window.location.href = payUrl
  },

  /**
   * 公众号支付（基于JSAPI）
   * @param {Object} payParams 支付参数
   * @param {Function} success 成功回调
   * @param {Function} fail 失败回调
   */
  jsApiPay: function(payParams, success, fail) {
    if (!window.WeixinJSBridge) {
      fail(new Error('请在微信浏览器中打开'))
      return
    }

    // 公众号支付参数与小程序类似
    window.WeixinJSBridge.invoke(
      'getBrandWCPayRequest',
      {
        appId: payParams.appId, // 公众号ID
        timeStamp: payParams.timeStamp.toString(),
        nonceStr: payParams.nonceStr,
        package: payParams.package,
        signType: payParams.signType || 'RSA',
        paySign: payParams.paySign
      },
      (res) => {
        if (res.err_msg === 'get_brand_wcpay_request:ok') {
          success(res)
        } else {
          fail(new Error('支付失败：' + res.err_msg))
        }
      }
    )
  },

  /**
   * 统一支付入口（自动判断环境）
   * @param {Object} payParams 支付参数（后端返回）
   * @param {Function} success 成功回调
   * @param {Function} fail 失败回调
   */
  pay: function(payParams, success, fail) {
    try {
      // 判断环境：小程序环境
      if (typeof wx !== 'undefined' && wx.getSystemInfoSync) {
        this.miniProgramPay(payParams, success, fail)
      }
      // 微信浏览器环境（H5/公众号）
      else if (window.navigator.userAgent.includes('MicroMessenger')) {
        if (payParams.payUrl) {
          this.h5Pay(payParams.payUrl)
        } else {
          this.jsApiPay(payParams, success, fail)
        }
      } else {
        fail(new Error('请在微信或小程序中使用支付功能'))
      }
    } catch (err) {
      fail(err)
    }
  },

  /**
   * 验证支付结果（前端主动查询，防止回调丢失）
   * @param {String} outTradeNo 商户订单号
   * @returns {Promise} 支付结果
   */
  verifyPayment: function(outTradeNo) {
    return new Promise((resolve, reject) => {
      // 调用后端接口查询支付状态
      uni.request({ // 若为Vue项目，替换为axios
        url: '/property/payment/verify',
        method: 'get',
        headers: {
          'Authorization': 'Bearer ' + getToken()
        },
        params: { outTradeNo },
        success: (res) => {
          if (res.data.code === 200) {
            resolve(res.data.data) // { paid: true/false, ... }
          } else {
            reject(new Error(res.data.msg))
          }
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }
}

export default wxPay
